home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 42 / Amiga Format AFCD42 (Issue 126, Aug 1999).iso / -serious- / programming / other / jikes / src / double.h < prev    next >
C/C++ Source or Header  |  1999-05-14  |  4KB  |  143 lines

  1. // $Id: double.h,v 1.3 1999/01/25 20:00:28 shields Exp $
  2. //
  3. // This software is subject to the terms of the IBM Jikes Compiler
  4. // License Agreement available at the following URL:
  5. // http://www.ibm.com/research/jikes.
  6. // Copyright (C) 1996, 1998, International Business Machines Corporation
  7. // and others.  All Rights Reserved.
  8. // You must accept the terms of that agreement to use this software.
  9. //
  10. #ifndef Double_INCLUDED
  11. #define Double_INCLUDED
  12.  
  13. #include "config.h"
  14. #include <math.h>
  15. #include "bool.h"
  16.  
  17. class LongInt;
  18. class IEEEdouble;
  19. class IEEEfloat
  20. {
  21.     protected:
  22.         union
  23.         {
  24.             float float_value;
  25.             u4 word;
  26.         } value;
  27.  
  28.     public:
  29.  
  30.         u4 &Word() { return value.word; }
  31.         float &FloatValue() { return value.float_value; }
  32.  
  33.         IEEEfloat(float);
  34.         IEEEfloat(u4);
  35.  
  36.         IEEEfloat(i4);
  37.         IEEEfloat(char *);
  38.         IEEEfloat(IEEEdouble a);
  39.  
  40.         inline IEEEfloat (void) {}
  41.  
  42.         IEEEfloat  operator+  (IEEEfloat); // binary addition
  43.         IEEEfloat  operator+  ();         // unary plus
  44.         IEEEfloat& operator+= (IEEEfloat); // add and assign
  45.  
  46.         IEEEfloat  operator-  (IEEEfloat); // binary subtraction
  47.         IEEEfloat  operator-  ();         // unary minus
  48.         IEEEfloat& operator-= (IEEEfloat); // subtract and assign
  49.  
  50.         IEEEfloat  operator* (IEEEfloat);  // multiplication
  51.         IEEEfloat& operator*=(IEEEfloat);  // multiply and assign
  52.  
  53.         IEEEfloat  operator/ (IEEEfloat);  // divide
  54.         IEEEfloat& operator/=(IEEEfloat);  // divide and assign
  55.  
  56.         bool      operator== (IEEEfloat); // equal
  57.         bool      operator!= (IEEEfloat); // not equal
  58.  
  59.         bool  operator<  (IEEEfloat); // less-than
  60.         bool  operator>  (IEEEfloat); // greater-than
  61.         bool  operator<= (IEEEfloat); // less-than or equal
  62.         bool  operator>= (IEEEfloat); // greater-than or equal
  63.  
  64.         int IntValue();
  65.         int LongValue();
  66.  
  67.         static void Fmodulus(IEEEfloat, IEEEfloat, IEEEfloat&);
  68.         static void Divide(IEEEfloat, IEEEfloat, IEEEfloat &, IEEEfloat &);
  69.         void String(char *);
  70. };
  71.  
  72.  
  73. class IEEEdouble
  74. {
  75. protected:
  76.     union
  77.     {
  78.         double double_value;
  79.         u4 word[2];
  80.     } value;
  81.  
  82. public:
  83.  
  84. #ifdef BIGENDIAN
  85.     u4 &HighWord() { return value.word[0]; }
  86.     u4 &LowWord()  { return value.word[1]; }
  87. #else
  88.     u4 &LowWord()  { return value.word[0]; }
  89.     u4 &HighWord() { return value.word[1]; }
  90. #endif
  91.  
  92.     double &DoubleValue() { return value.double_value; }
  93.  
  94.     static IEEEdouble min_long;
  95.  
  96.     //
  97.     //     static inline IEEEdouble NaN()               { return  zero / zero; }
  98.     //     static inline IEEEdouble POSITIVE_INFINITY() { return  1.0  / zero; }
  99.     //     static inline IEEEdouble NEGATIVE_INFINITY() { return -1.0  / zero; }
  100.     //
  101.     static inline IEEEdouble NaN()               { return  IEEEdouble(0x7fffffff, 0xffffffff); }
  102.     static inline IEEEdouble POSITIVE_INFINITY() { return  IEEEdouble(0x7ff00000, 0x00000000); }
  103.     static inline IEEEdouble NEGATIVE_INFINITY() { return  IEEEdouble(0xfff00000, 0x00000000); }
  104.  
  105.     IEEEdouble(LongInt&);
  106.     IEEEdouble(double);
  107.     IEEEdouble(u4, u4);
  108.     IEEEdouble(u4);
  109.     IEEEdouble(IEEEfloat);
  110.     IEEEdouble(i4);
  111.     IEEEdouble(char *);
  112.     inline IEEEdouble (void) {}
  113.  
  114.     IEEEdouble  operator+  (IEEEdouble); // binary addition
  115.     IEEEdouble  operator+  ();         // unary plus
  116.     IEEEdouble& operator+= (IEEEdouble); // add and assign
  117.  
  118.     IEEEdouble  operator-  (IEEEdouble); // binary subtraction
  119.     IEEEdouble  operator-  ();         // unary minus
  120.     IEEEdouble& operator-= (IEEEdouble); // subtract and assign
  121.  
  122.     IEEEdouble  operator* (IEEEdouble);  // multiplication
  123.     IEEEdouble& operator*=(IEEEdouble);  // multiply and assign
  124.  
  125.     IEEEdouble  operator/ (IEEEdouble);  // divide
  126.     IEEEdouble& operator/=(IEEEdouble);  // divide and assign
  127.  
  128.     bool  operator== (IEEEdouble); // equal
  129.     bool  operator!= (IEEEdouble); // not equal
  130.     bool  operator<  (IEEEdouble); // less-than
  131.     bool  operator>  (IEEEdouble); // greater-than
  132.     bool  operator<= (IEEEdouble); // less-than or equal
  133.     bool  operator>= (IEEEdouble); // greater-than or equal
  134.  
  135.     inline int IntValue() { return (int) DoubleValue(); }
  136.     void String(char *);
  137.  
  138.     static void Divide(IEEEdouble, IEEEdouble, IEEEdouble &);
  139.     static void Fmodulus(IEEEdouble, IEEEdouble, IEEEdouble &);
  140. };
  141.  
  142. #endif
  143.